<?php
/**
 * フォームヘルパークラスファイル
 *
 */

/**
 * フォームヘルパークラス
 *
 * 配列を<select>や<input type="radio|checkbox">で使いやすくする
 * Smartyテンプレートを意識したものになっています
 *
 */
class FormHelper {
	/**
	 * データを格納するSimpleXMLElementオブジェクト
	 *
	 * @var SimpleXMLElement
	 */
	protected $sxml = null;
	/**
	 * コンストラクタ
	 *
	 * @param string $fileName データファイル名
	 */
	public function __construct($fileName) {
		$this->sxml = simplexml_load_file(VISION_APP_PATH.'settings/'.$fileName);
	}
	/**
	 * 配列をFormHelperにセットする
	 *
	 * @param string $varName 配列名
	 * @param array $arrays 配列
	 * @param boolean $assignFlag レスポンスクラスに割り当てるかどうか
	 * @param boolean $autoFlag 自動ラベリングを利用するかどうか
	 */
	public function setArray($varName, $arrays, $assignFlag, $autoFlag) {
		$varsElem = $this->sxml->addChild($varName);
		$varsElem->addAttribute('type', 'hash');
		if ($assignFlag) {
			$varsElem->addAttribute('assign', 'true');
		}
		if ($autoFlag) {
			$varsElem->addAttribute('auto', 'true');
		}
		foreach ($arrays as $key => $val) {
			$valueElem = $varsElem->addChild('value', $val);
			$valueElem->addAttribute('key', $key);
		}
	}
	/**
	 * FormHelperにセットされている配列を返す
	 *
	 * @param string $varName 配列名
	 * @return array 配列
	 */
	public function getArray($varName) {
		$data = $this->sxml->$varName;
		$type = $data['type'];
		if ($type == 'hash') {
			foreach ($data->value as $contents) {
				$key = (integer) $contents['key'];
				$val = (string) $contents;
				$result[$key] = $val;
			}
		}
		return $result;
	}
	/**
	 * FormHelperにセットされている配列から指定した添字のデータを返す
	 *
	 * @param string $varName 配列名
	 * @param mixed $idx 添字
	 * @return mixed 取得された配列の内容
	 */
	public function getValue($varName, $idx) {
		$data = $this->sxml->$varName;
		$type = $data['type'];
		if ($type == 'hash') {
			foreach ($data->value as $contents) {
				$key = (integer) $contents['key'];
				$val = (string) $contents;
				$result[$key] = $val;
			}
		}
		return $result[(integer) $idx];
	}
	/**
	 * リクエスト要素に対してラベル属性を付加する
	 * 
	 * 配列名 hogehoge[2] = "うに丼" だった場合<br>
	 * <request><br>
	 *   <hogehoge><br>
	 *     <value>2</value><br>
	 *   </hogehoge><br>
	 * </request><br>
	 * というリクエストデータに対して<br>
	 * <request><br>
	 *   <hogehoge><br>
	 *     <value label="うに丼">2</value><br>
	 *   </hogehoge><br>
	 * </request><br>
	 * というラベル付けを行う
	 *
	 * @param SimpleXMLElement $sxmlElem 対象とするリクエスト要素
	 * @param string $arrayName 配列名
	 */
	public function addLabel($sxmlElem, $arrayName) {
		foreach ($sxmlElem->$arrayName as $target) {
			$arrayNumber = $target->value;
			$labelStr = $this->getValue($arrayName, $arrayNumber);
			if ($target->value['label']) {
				$target->value['label'] = (string) $labelStr;
			} else {
				$target->value->addAttribute('label', $labelStr);
			}
		}
	}
	/**
	 * リクエスト要素に対してFormHelperデータ内で"auto"属性が
	 * 有効なものに一括してラベル付けを行う
	 *
	 * @param SimpleXMLElement $sxmlElem 対象とするリクエスト要素
	 */
	public function autoLabeling($sxmlElem) {
		foreach ($this->sxml->children() as $field) {
			if ((string) $field['auto'] == "true") {
				$fieldName = (string) $field->getName();
				$this->addLabel($sxmlElem, $fieldName);
			}
		}
	}
	/**
	 * FormHelperデータをリクエストクラスにassignする
	 *
	 * @param Response $resClass レスポンスクラス
	 */
	public function assign($resClass) {
		foreach ($this->sxml->children() as $field) {
			if ((string) $field['assign'] == "true") {
				$fieldName = $field->getName();
				$tplVarName = 'OPT_'.strtoupper($fieldName);
				$resClass->assign($tplVarName, $this->getArray($fieldName));
			}
		}
	}
}
